// utils/device-id.js
import { ref, computed, onMounted } from 'vue';

// 存储键名
const DEVICE_ID_KEY = 'permanent_device_id';
const DEVICE_INFO_KEY = 'device_info';

export const useDeviceId = () => {
  const deviceId = ref('');
  const isReady = ref(false);
  const isError = ref(false);

  // 初始化设备ID
  const initDeviceId = async () => {
    try {
      // 检查是否已有设备ID
      const savedDeviceId = uni.getStorageSync(DEVICE_ID_KEY);
      const savedDeviceInfo = uni.getStorageSync(DEVICE_INFO_KEY);

      // 获取当前设备信息
      const currentDeviceInfo = generateDeviceInfo();

      // 如果设备信息变化或没有保存的ID，重新生成
      if (!savedDeviceId || savedDeviceInfo !== currentDeviceInfo) {
        const newDeviceId = generatePermanentDeviceId(currentDeviceInfo);

        // 保存新的设备ID和设备信息
        uni.setStorageSync(DEVICE_ID_KEY, newDeviceId);
        uni.setStorageSync(DEVICE_INFO_KEY, currentDeviceInfo);

        deviceId.value = newDeviceId;
      } else {
        // 使用已保存的设备ID
        deviceId.value = savedDeviceId;
      }

      isReady.value = true;
    } catch (error) {
      console.error('❌ 获取设备ID失败:', error);
      isError.value = true;
    }
  };

  // 生成设备基础信息（用于生成永久ID）
  const generateDeviceInfo = () => {
    const systemInfo = uni.getSystemInfoSync();

    // 组合设备固定信息（选择最稳定的设备特征）
    return [
      systemInfo.model,           // 设备型号
      systemInfo.brand,           // 设备品牌
      systemInfo.platform,        // 平台
      systemInfo.deviceId,        // 设备ID（App平台特有）
      systemInfo.system,          // 系统版本
      systemInfo.SDKVersion,      // SDK版本
      // 添加更多稳定的设备特征...
    ].join('|');
  };

  // 生成永久设备ID
  const generatePermanentDeviceId = (deviceInfo) => {
    // 使用设备信息生成哈希值
    const hash = hashString(deviceInfo);

    // 添加前缀，便于识别
    return 'PID_' + hash;
  };

  // 字符串哈希函数
  const hashString = (str) => {
    if (!str) return 'EMPTY_HASH';

    // 使用SHA-1算法（更安全的哈希）
    let hash = 0;
    for (let i = 0; i < str.length; i++) {
      const char = str.charCodeAt(i);
      hash = ((hash << 5) - hash) + char;
      hash = hash & hash; // 转换为32位整数
    }

    // 转换为Base64编码，移除特殊字符
    return Math.abs(hash).toString(36).padStart(16, '0').toUpperCase();
  };

  // 生命周期钩子：组件挂载后初始化
  onMounted(() => {
    initDeviceId();
  });

  return {
    deviceId: computed(() => deviceId.value),
    isReady: computed(() => isReady.value),
    isError: computed(() => isError.value),
    refreshDeviceId: initDeviceId
  };
};